package cn.tedu.erp.project.service.impl;

import cn.tedu.erp.project.ex.ServiceException;
import cn.tedu.erp.project.mapper.DeptMapper;
import cn.tedu.erp.project.mapper.DeptRoleMapper;
import cn.tedu.erp.project.pojo.dto.DeptAddNewDTO;
import cn.tedu.erp.project.pojo.dto.DeptUpdateDTO;
import cn.tedu.erp.project.pojo.entity.Dept;
import cn.tedu.erp.project.pojo.entity.DeptRole;
import cn.tedu.erp.project.pojo.vo.AdminListVO;
import cn.tedu.erp.project.pojo.vo.DeptListVO;
import cn.tedu.erp.project.pojo.vo.DeptStandardVO;
import cn.tedu.erp.project.service.IDeptService;
import cn.tedu.erp.project.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Slf4j
@Service
@Transactional
public class DeptServiceImpl implements IDeptService {
    @Autowired
    private DeptMapper deptMapper;
    @Autowired
    private DeptRoleMapper deptRoleMapper;

    /**
     * 添加部门
     *
     * @param deptAddNewDTO
     */
    @Override
    public void addNew(DeptAddNewDTO deptAddNewDTO) {
        log.debug("开始处理添加部门的业务,参数为:{}", deptAddNewDTO);
        //通过参数得到角色id的数组
        Long[] roleIds = deptAddNewDTO.getRoleIds();
        for (Long roleId : roleIds) {
            if (roleId == 1) {
                //是:抛出异常
                String message = "添加失败,部门已存在!";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
            }
        }
        //从参数对象中获取部门的名称
        String name = deptAddNewDTO.getName();
        //调用deptMapper的countbyname()执行统计
        int countName = deptMapper.countByName(name);
        //判断统计结果是否大于0
        if (countName > 0) {
            //是:抛出异常
            String message = "添加失败,添加的部门名称已存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }
        //创建对象
        Dept dept = new Dept();
        //复制属性
        BeanUtils.copyProperties(deptAddNewDTO, dept);
        // 调用deptMapper的insert方法
        int row = deptMapper.insert(dept);
        if (row != 1) {
            String message = "添加部门失败,服务器忙,稍后再试!!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_INSERT, message);
        }
        //为新添加的部门分配角色
        //基于角色id的数组创建deptMapper的批量插入角色的参数list<DeptRole>
        List<DeptRole> deptRoleList = new ArrayList<>();
        for (Long roleId : roleIds) {
            DeptRole deptRole = new DeptRole();//创建部门角色对象
            deptRole.setDeptId(dept.getId());//添加要绑定对应角色的部门id
            deptRole.setRoleId(roleId);//添加角色id
            deptRoleList.add(deptRole);//将部门角色对象添加到数组中
        }
        //调用deptRoleMapper的insertBatch()执行插入
        row = deptRoleMapper.insertBatch(deptRoleList);
        if (row < 1) {
            String message = "添加部门失败,服务器忙,稍后再试??";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_INSERT, message);
        }
    }

    /**
     * 根据id删除部门
     *
     * @param id
     */
    @Override
    public void deleteById(Long id) {
        log.debug("开始处理删除部门的业务,参数为id={}", id);
        if (id == 1) {
            String message = "删除失败,被删除的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        //查看被删除的对象是否有用户,有:不能删,报异常
        int row = deptMapper.countAdminsById(id);
        if (row > 0) {
            String message = "删除失败,部门还有员工!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }
        //查询被删除的对象是否存在,否:报异常
        DeptStandardVO deptStandardVO = deptMapper.getStandardById(id);
        if (deptStandardVO == null) {
            String message = "删除失败,被删除的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        //调用deptMapper的delete方法
        row = deptMapper.deleteById(id);
        if (row != 1) {
            String message = "删除失败,服务器忙,稍后再试!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_DELETE, message);
        }
        //调用deptRoleMapper的delete方法
        row = deptRoleMapper.deleteByDeptId(id);
        if (row < 1) {
            String message = "删除失败,服务器忙,稍后再试!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_DELETE, message);
        }
    }

    /**
     * 根据id修改部门
     *
     * @param id
     */
    @Override
    public void updateById(Long id, DeptUpdateDTO deptUpdateDTO) {
        log.debug("开始处理修改部门的业务,参数为id={}", id);
        if (id == 1) {
            String message = "修改失败,被修改的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        //查询要修改的部门是否存在
        DeptStandardVO deptStandardVO = deptMapper.getStandardById(id);
        if (deptStandardVO == null) {
            String message = "修改失败,部门不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        log.debug("根据id={}获取的部门名称是否存在,结果为{}", id, deptStandardVO.getName());
        //查询要修改的部门名称是否同名
        int count = deptMapper.countByNameAndNotId(id, deptUpdateDTO.getName());
        if (count > 0) {
            String message = "修改失败,部门名称已经被占用";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }
        Dept dept = new Dept();
        //复制属性
        BeanUtils.copyProperties(deptUpdateDTO, dept);
        //设置id
        dept.setId(id);
        int rows = deptMapper.update(dept);
        if (rows != 1) {
            String message = "修改部门失败,服务器忙,请稍后再试!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
        }
    }

    /**
     * 根据id查询部门详情
     *
     * @param id
     * @return
     */
    @Override
    public DeptStandardVO getStandardById(Long id) {
        log.debug("开始处理查询部门详情的业务,参数为id={}", id);
        if (id == 1) {
            String message = "查询失败,被查询的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        //调用deptMapper的getstandardvo方法
        DeptStandardVO deptStandardVO = deptMapper.getStandardById(id);
        if (deptStandardVO == null) {
            String message = "查询失败,被查询的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return deptStandardVO;
    }

    /**
     * 根据部门名称查询部门详情
     *
     * @param name
     * @return
     */
    @Override
    public DeptStandardVO getStandardByName(String name) {
        log.debug("开始处理查询部门详情的业务,参数为id={}", name);
        if (name.equals(BOSS)) {
            String message = "查询失败,被查询的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        //调用deptMapper的getStandardByName方法
        DeptStandardVO deptStandardVO = deptMapper.getStandardByName(name);
        if (deptStandardVO == null) {
            String message = "查询失败,被查询的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return deptStandardVO;
    }

    /**
     * 查询部门列表
     *
     * @return
     */
    @Override
    public List<DeptListVO> list() {
        log.debug("开始处理[查询部门列表]的业务,无参数");
        //调用deptMapper的list方法
        List<DeptListVO> list = deptMapper.list();
        //使用list的迭代器
        Iterator<DeptListVO> iterator = list.iterator();
        //查询为1的对象,直到将该对象从list集合中删除
        while (iterator.hasNext()) {
            DeptListVO item = iterator.next();
            if (item.getId() == 1) {
                iterator.remove();
                break;
            }
        }
        return list;
    }

    /**
     * 查询部门用户列表
     * @param id
     * @return
     */
    @Override
    public List<AdminListVO> listAdmin(Long id) {
        log.debug("开始处理[查询部门用户列表]的业务,无参数");
        if (id == 1) {
            String message = "查询失败,被查询的部门不存在!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        List<AdminListVO> adminListVO = deptMapper.listAdminById(id);
        if (adminListVO.isEmpty()){
            String message = "查询失败,被查询的部门为空!";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return adminListVO;
    }

}
